package com.smdp.service;

import com.smdp.dto.Result;
import com.smdp.entity.Blog;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 博客服务接口。
 * 包含发博客（审核后正式发布）、更新博客（审核后正式更新）、为博客点赞、查询（自己的、根据用户id、热门、根据博客id）博客、删除博客，
 * 以及更新和发布审核通过的博客。
 *
 * @author 蔡方珩
 */
public interface IBlogService extends IService<Blog> {
    /**
     * 根据博客id查询博客
     * @param id 博客id
     * @return 成功：博客 / 失败：失败原因
     */
    Result queryBlogById(Long id);
    /**
     * 查询热门博客（按点赞数排序）
     * @param current 当前页数
     * @return 成功：分页热门博客
     */
    Result queryHotBlog(Integer current);
    /**
     * 点赞博客。
     * 如果用户已经点赞则取消点赞。
     * @param id 博客id
     * @return ok
     */
    Result likeBlog(Long id);
    /**
     * 查询最先点赞博客的5名用户
     * @param id 博客id
     * @return 成功：先点赞博客的5名用户的列表 / 失败：空白列表
     */
    Result queryBlogLikes(Long id);
    /**
     * 查询“我的关注”博主发的博客
     * @param lastId 上次查询的最小时间戳，即本轮查询的、第一条博客的时间戳，是查询的原点
     * @param offset 偏移量，时间戳为lastId、且已查询过的博客数量
     * @return 成功：ScrollResult，储存Blog、minTime、offset / 失败：失败原因
     */
    Result queryBlogOfFollow(Long lastId, Integer offset);
    /**
     * 查询我的博客
     *
     * @param current 当前页数
     * @return 分页的我的博客
     */
    Result queryMyBlog(Integer current);
    /**
     * 根据id删除博客
     *
     * @param id 博客id
     * @return 成功：blogId / 失败：失败原因
     */
    Result deleteBlogById(Long id);
    /**
     * 发布审核通过的博客。
     * @param blog 博客对象
     */
    void saveBlogAfterVerify(Blog blog);
    /**
     * 更新审核通过的博客
     *
     * @param blog 博客对象
     */
    void updateBlogAfterVerify(Blog blog);
    /**
     * 发博客，将博客推送到MQ等待审核，审核通过后发布。
     *
     * @param blog 博客对象
     * @return ok
     */
    Result saveBlog(Blog blog) throws Exception;
    /**
     * 更新博客，将博客推送到MQ等待审核，审核通过后更新。
     *
     * @param blog 博客对象
     * @return ok
     */
    Result updateBlog(Blog blog) throws Exception;
    /**
     * 根据用户id查询博客
     *
     * @param current 当前页数
     * @param userId  用户id
     * @return 分页的用户博客
     */
    Result queryBlogByUserId(Integer current, Long userId);
}
